package com.xy.dynamicproxy;

import java.lang.reflect.Proxy;

/**
 * @author 谢阳
 * @version 1.8.0_131
 * @date 2022/6/15 21:25
 * @description
 */
public class ProxyFactory{
    // 目标对象
    private Object target;

    // 构造器，对target进行初始化
    public ProxyFactory(Object target) {
        this.target = target;
    }


    /**
     * 方法执行前
     */
    public void preMethod() {
        System.out.println("方法执行前...");
    }

    /**
     * 方法执行后
     */
    private void afterMethod() {
        System.out.println("方法执行后...");
    }

    // 给目标对象生成代理对象
    public Object getProxyInstance() {

        /**
         * ClassLoader loader, 指定类加载器
         * Class<?>[] interfaces,目标对象（被代理对象），使用泛型方式确认类型
         * InvocationHandler h 事件处理执行目标对象的方法时，会触发时间处理器的方法
         * 会把当前执行的目标对象方法作为参数传入
         */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    preMethod();
                    // 反射机制调用目标对象方法
                    Object invoke = method.invoke(target, args);
                    afterMethod();
                    return invoke;
                });
    }
}
